package br.museu.negocio;

import java.util.List;

import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.museu.dao.basic.intefaces.IUsuarioDAO;
import br.museu.excessoes.CampoObrigatorioException;
import br.museu.excessoes.LoginJaCadastradoException;
import br.museu.excessoes.ObjetoNaoEncontradoException;
import br.museu.excessoes.SenhaInvalidaException;
import br.museu.excessoes.UsuarioInvalidoException;
import br.museu.model.Evento;
import br.museu.model.Usuario;
import br.museu.model.enums.TipoUsuario;
import br.museu.negocio.interfaces.IUsuarioNegocio;

@Service("usuarioNegocio")
@Transactional
public class UsuarioNegocio implements IUsuarioNegocio {

	@Autowired
	private IUsuarioDAO usuarioDAO;

	public UsuarioNegocio() {
	}

	public Usuario loginUsuario(String login, String senha) throws CampoObrigatorioException, ObjetoNaoEncontradoException {

		if (login == null || login.isEmpty()) {
			throw new CampoObrigatorioException("login");
		}

		if (senha == null || senha.isEmpty()) {
			throw new CampoObrigatorioException("senha");
		}

		Usuario usuario = usuarioDAO.getUsuarioByLoginSenha(login, senha);

		if (usuario == null) {
			throw new ObjetoNaoEncontradoException();
		}

		return usuario;
	}

	public void cadastrarUsuario(Usuario usuario) throws UsuarioInvalidoException, LoginJaCadastradoException, SenhaInvalidaException {

		if (usuario == null) {
			throw new UsuarioInvalidoException();
		}

		if (usuarioDAO.getUsuarioByLogin(usuario.getLogin()) != null) {
			throw new LoginJaCadastradoException(usuario.getLogin());
		}

		if (!usuario.getSenha().equals(usuario.getSenhaConfirm())) {
			throw new SenhaInvalidaException();
		}

		usuario.setTipo(TipoUsuario.VISITANTE);
		usuario.setDtCriacao(LocalDate.now());
		usuario.setDtUltimoAcesso(LocalDate.now());
		usuarioDAO.inserir(usuario);

	}

	public void deletarUsuario(Usuario usuario) {

		if (usuario != null) {
			usuarioDAO.remover(usuario);
		}

	}

	public List<Usuario> listarUsuarios() {
		return usuarioDAO.consultarTodos();
	}

	public List<Usuario> listarUsuariosEvento(Evento evento) {
		return null;
	}

	public void alterarUsuario(Usuario usuario, String senha, String nome, String dtNascimento, String senhaConfirm) throws SenhaInvalidaException {

		if (nome != null && !nome.isEmpty()) {
			usuario.setNomeCompleto(nome);
		}

		if (dtNascimento != null && !dtNascimento.isEmpty()) {
			usuario.setDataNascimento(dtNascimento);
		}

		if (senha != null && !senha.isEmpty()) {
			if (!senha.equals(senhaConfirm)) {
				throw new SenhaInvalidaException();
			}

			usuario.setSenha(senha);
		}

		usuarioDAO.alterar(usuario);

	}

}
